package mastermind.logic;

import java.util.ArrayList;
import java.util.Timer;

/**
 * Diese Klasse verwaltet s&auml;mtliche Threads. Sie bietet die M&ouml;glichkeit
 * gezielt Threads zu beenden oder auch einfach alle zu beenden, damit die Anwendung
 * sauber geschlossen werden kann
 */
public class ThreadManager
{

	private static ArrayList<SolverThread>	_thSolve	= new ArrayList<SolverThread>();
	private static ArrayList<Timer>			_timer		= new ArrayList<Timer>();

	/**
	 * Alle Funktionen in der Klasse sind statisch<br>
	 * Es ist nicht n&ouml;tig ein Objekt davon zu erstellen
	 */
	private ThreadManager()
	{}

	/**
	 * F&uuml;gt einen neuen SolverThread zur Liste hinzu
	 * 
	 * @param th
	 *            Neuer SolverThread
	 */
	public static void addSolverThread(SolverThread th)
	{
		_thSolve.add(th);
	}

	/**
	 * Entfernt einen SolverThread, da sich dieser beendet hat.
	 * 
	 * @param th
	 *            Beendeter SolverThread
	 */
	public static void removeSolverThread(SolverThread th)
	{
		_thSolve.remove(th);
	}

	/**
	 * Alle SolverThread beenden
	 */
	public static void killSolverThreads()
	{
		for (SolverThread th : _thSolve)
		{
			// Das interrupt wird im Thread abgefragt. Dieser beendet sich dann.
			th.interrupt();
		}
	}

	/**
	 * F&uuml;gt einen Timer zur Liste hinzu
	 * 
	 * @param timer
	 *            Neuer Timer
	 */
	public static void addTimer(Timer timer)
	{
		_timer.add(timer);
	}

	/**
	 * Enfernt einen Timer, der seine Aufgabe erf&uuml;llt hat
	 * 
	 * @param timer
	 *            Erledigter Timer
	 */
	public static void removeTimer(Timer timer)
	{
		_timer.remove(timer);
	}

	/**
	 * Alle Timer abbrechen
	 */
	public static void killTimers()
	{
		for (Timer t : _timer)
		{
			t.cancel();
			removeTimer(t);
		}
	}

	/**
	 * Alles beenden. Danach kann die Anwendung sauber beendet werden.
	 */
	public static void killAllThreads()
	{
		killSolverThreads();
		killTimers();
	}
}
